//
//  BLEDataConverter.h
//  BLESDK
//
//  Created on Desktop.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

/**
 * BLE数据转换工具类
 * 提供各种数据格式之间的转换方法
 */
@interface BLEDataConverter : NSObject

/**
 * 十六进制字符串转NSData
 * @param hexString 十六进制字符串，如"01AB23"
 * @return NSData数据
 */
+ (nullable NSData *)dataFromHexString:(NSString *)hexString;

/**
 * NSData转十六进制字符串
 * @param data 二进制数据
 * @param uppercase 是否使用大写字母表示
 * @return 十六进制字符串
 */
+ (NSString *)hexStringFromData:(NSData *)data uppercase:(BOOL)uppercase;

/**
 * NSData转十六进制字符串 (默认使用大写)
 * @param data 二进制数据
 * @return 十六进制字符串
 */
+ (NSString *)hexStringFromData:(NSData *)data;

/**
 * 十六进制字符串转ASCII字符串
 * @param hexString 十六进制字符串
 * @return ASCII字符串
 */
+ (nullable NSString *)asciiStringFromHexString:(NSString *)hexString;

/**
 * ASCII字符串转十六进制字符串
 * @param asciiString ASCII字符串
 * @param uppercase 是否使用大写字母表示
 * @return 十六进制字符串
 */
+ (NSString *)hexStringFromASCIIString:(NSString *)asciiString uppercase:(BOOL)uppercase;

/**
 * NSData转ASCII字符串
 * @param data 二进制数据
 * @return ASCII字符串
 */
+ (NSString *)asciiStringFromData:(NSData *)data;

/**
 * ASCII字符串转NSData
 * @param asciiString ASCII字符串
 * @return NSData数据
 */
+ (NSData *)dataFromASCIIString:(NSString *)asciiString;

/**
 * 将整数转换为指定字节长度的NSData (小端序)
 * @param value 整数值
 * @param length 字节长度
 * @return NSData
 */
+ (NSData *)dataWithIntValue:(NSInteger)value length:(NSUInteger)length;

/**
 * 将整数转换为指定字节长度的NSData，可指定字节序
 * @param value 整数值
 * @param length 字节长度
 * @param bigEndian 是否使用大端序，NO表示小端序
 * @return NSData
 */
+ (NSData *)dataWithIntValue:(NSInteger)value length:(NSUInteger)length bigEndian:(BOOL)bigEndian;

/**
 * 从NSData中读取整数值 (小端序)
 * @param data 二进制数据
 * @param startIndex 起始索引
 * @param length 字节长度
 * @return 整数值
 */
+ (NSInteger)intValueFromData:(NSData *)data startIndex:(NSUInteger)startIndex length:(NSUInteger)length;

/**
 * 从NSData中读取整数值，可指定字节序
 * @param data 二进制数据
 * @param startIndex 起始索引
 * @param length 字节长度
 * @param bigEndian 是否使用大端序，NO表示小端序
 * @return 整数值
 */
+ (NSInteger)intValueFromData:(NSData *)data startIndex:(NSUInteger)startIndex length:(NSUInteger)length bigEndian:(BOOL)bigEndian;

/**
 * 合并多个NSData
 * @param firstData 第一个NSData
 * @param ... 可变参数列表，以nil结尾
 * @return 合并后的NSData
 */
+ (NSData *)combineData:(NSData *)firstData, ... NS_REQUIRES_NIL_TERMINATION;

/**
 * 合并NSData数组
 * @param dataArray NSData数组
 * @return 合并后的NSData
 */
+ (NSData *)combineDataArray:(NSArray<NSData *> *)dataArray;

/**
 * 从NSData中截取指定范围的数据
 * @param data 源数据
 * @param range 要截取的范围
 * @return 截取后的数据
 */
+ (nullable NSData *)subDataWithData:(NSData *)data range:(NSRange)range;

/**
 * 将浮点数转换为NSData
 * @param floatValue 浮点数值
 * @param bigEndian 是否使用大端序，NO表示小端序
 * @return NSData
 */
+ (NSData *)dataWithFloat:(float)floatValue bigEndian:(BOOL)bigEndian;

/**
 * 从NSData中读取浮点数
 * @param data 二进制数据
 * @param startIndex 起始索引
 * @param bigEndian 是否使用大端序，NO表示小端序
 * @return 浮点数值
 */
+ (float)floatFromData:(NSData *)data startIndex:(NSUInteger)startIndex bigEndian:(BOOL)bigEndian;

@end

NS_ASSUME_NONNULL_END 